package sistemaDefensivo;

import java.util.ArrayList;
import java.util.HashMap;
import escenario.Posicion;
import comunicacion.Mensaje;
import comunicacion.Servidor;

public class ServidorTerrestre implements Runnable{
	private final int radioProtegido = 10;
	private ArrayList <RespuestaAtaque> respuestasAtaques;
	private ArrayList <Posicion> posicionesEnemigos;
	private RespuestaAtaque respuestaAtaque;
	private Servidor server;
	private Mensaje mensajeME;
	private ArrayList <Mensaje> misilesInofensivos; 
	private HashMap<Integer, Thread> mapRespAttack;
	
	public ServidorTerrestre(){
		misilesInofensivos = new ArrayList <Mensaje> ();
		server = new Servidor(5000);
		mapRespAttack = new HashMap<Integer, Thread>();
	}
	
	public Posicion getPosicionesEnemigos(int pos) {
		return posicionesEnemigos.get(pos);
	}

	public void addPosicionesEnemigos(Posicion pos) {
		posicionesEnemigos.add(pos);
	}

	public RespuestaAtaque getRespuestaAtaque(int pos) {
		return respuestasAtaques.get(pos);
	}

	public void addRespuestaAtaque(RespuestaAtaque respuestaAtaque) {
		respuestasAtaques.add(respuestaAtaque);
	}

	public void iniciarDefensa(Posicion po){
		
	}
	
	private boolean inofensivoDetectado(int id){
		boolean inofensivo = false;
		for(int i=0; i<misilesInofensivos.size(); i++){
			if(id == misilesInofensivos.get(i).getId()){
				inofensivo = true;
				break;
			}
		}	
		return inofensivo;
	}
	
	private boolean tieneRiesgo(Mensaje mensaje){
		double x = mensaje.getXDest();
		double y = mensaje.getYDest();
		if(Math.sqrt(Math.pow(x,2) + Math.pow(y,2)) < radioProtegido)
			return true;
		else
			return false;
	}
	
	private void lanzarRespuesta(Mensaje mensaje){
		respuestaAtaque = new RespuestaAtaque(this, mensaje);
		Thread hiloRespAttack = new Thread (respuestaAtaque);
		mapRespAttack.put(mensaje.getId(), hiloRespAttack);
		hiloRespAttack.start();
	}
	
	public void removerRespuesta(int id){
		mapRespAttack.remove(id);
	}
	
	public void run(){
		System.out.println("Se inicia la ejecucion del Servidor Terrrestre");
		server.abrirServidor();
		while(true){
			server.conectar();
			mensajeME = server.readObject();
//			System.out.println("\nSERVIDOR TERRESTRE dice =================> Se recibe del Radar informacion del misil enemigo: " + mensajeME.getId());
			server.closeSocket();
			
			if(!inofensivoDetectado(mensajeME.getId())){
				if(tieneRiesgo(mensajeME)){
					if(!mapRespAttack.containsKey(mensajeME.getId())){
						lanzarRespuesta(mensajeME);
						System.out.println("\nSERVIDOR TERRESTRE dice =================> Se lanza Respuesta Ataque para el misil enemigo: " + mensajeME.getId());
					}
//					else
//						System.out.println("\nSERVIDOR TERRESTRE dice =================> El misil: " + mensajeME.getId() + " ya tiene Respuesta Ataque");
				}
				else{
					misilesInofensivos.add(mensajeME);
//					System.out.println("\nSERVIDOR TERRESTRE dice =================> El misil:" + mensajeME.getId() + " Se agrega a inofensivos");
				}
			}
//			else 
//				System.out.println("\nSERVIDOR TERRESTRE dice =================> El misil:" + mensajeME.getId() + " Ya esta en inofensivos");
		}
	}
}